package com.xjd.edu.user.service.impl;//package com.chapter.sample.user.service.impl;
//
//import cn.hutool.core.bean.BeanUtil;
//import cn.hutool.core.bean.copier.CopyOptions;
//import cn.hutool.core.lang.UUID;
//import cn.hutool.core.util.RandomUtil;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.chapter.sample.model.dto.LoginFormDTO;
//import com.chapter.sample.model.dto.UserDTO;
//import com.chapter.sample.toolkit.cache.GameRedisTemplate;
//import com.chapter.sample.user.dao.UserDao;
//import com.chapter.sample.model.User;
//import com.chapter.sample.user.service.UserService;
//import com.chapter.sample.utils.RegexUtils;
//import com.chapter.sample.utils.Result;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import java.time.Duration;
//import java.util.HashMap;
//import java.util.Map;
//
//import static com.chapter.sample.utils.RedisConstants.*;
//import static com.chapter.sample.utils.SystemConstants.USER_NICK_NAME_PREFIX;
//
//@Slf4j
//@Service("userService")
//public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {
//
//    //@Autowired
//    //private StringRedisTemplate stringRedisTemplate;
//
//    @Autowired
//    private GameRedisTemplate gameRedisTemplate;
//
//    @Autowired
//    private UserDao userDao;
//
//    @Override
//    public User findById(Integer id) {
//        return userDao.selectById(id);
//    }
//
//    @Override
//    public User findByMobile(String mobile) {
//        return userDao.selectOne(new QueryWrapper<User>().eq("phone", mobile));
//    }
//
//
//    @Override
//    public Result sendCode(String phone) {
//        // 1.校验手机号
//        if (RegexUtils.isPhoneInvalid(phone)) {
//            // 2.如果不符合，返回错误信息
//            return Result.fail("手机号格式错误！");
//        }
//        // 3.符合，生成验证码
//        String code = RandomUtil.randomNumbers(6);
//
//        // 4.保存验证码到 session
//        //stringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY + phone, code, LOGIN_CODE_TTL, TimeUnit.MINUTES);
//        gameRedisTemplate.set(LOGIN_CODE_KEY + phone, code, Duration.ofMinutes(LOGIN_CODE_TTL));
//        // 5.发送验证码
//        log.info("发送短信验证码成功，验证码：{}", code);
//        // 返回ok
//        return Result.ok();
//    }
//
//
//    @Override
//    public Result login(LoginFormDTO loginForm) {
//        // 1.校验手机号
//        String phone = loginForm.getPhone();
//        if (RegexUtils.isPhoneInvalid(phone)) {
//            // 2.如果不符合，返回错误信息
//            return Result.fail("手机号格式错误！");
//        }
//        // 3.从redis获取验证码并校验
//        //String cacheCode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY + phone);
//        String cacheCode = (String) gameRedisTemplate.get(LOGIN_CODE_KEY + phone).orElse(null);
//        String code = loginForm.getCode();
//        if (cacheCode == null || !cacheCode.equals(code)) {
//            // 不一致，报错
//            return Result.fail("验证码错误");
//        }
//
//        // 4.一致，根据手机号查询用户 select * from tb_user where phone = ?
//        User user = query().eq("phone", phone).one();
//
//        // 5.判断用户是否存在
//        if (user == null) {
//            // 6.不存在，创建新用户并保存
//            user = createUserWithPhone(phone);
//        }
//
//        // 7.保存用户信息到 redis中
//        // 7.1.随机生成token，作为登录令牌
//        String token = UUID.randomUUID().toString(true);
//        // 7.2.将User对象转为HashMap存储
//        UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
//        Map<String, Object> userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(),
//                CopyOptions.create()
//                        .setIgnoreNullValue(true)
//                        .setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString()));
//        // 7.3.存储
//        String tokenKey = LOGIN_USER_KEY + token;
//        gameRedisTemplate.hmset(tokenKey, userMap, Duration.ofMinutes(LOGIN_USER_TTL));
//        //stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);
//        // 7.4.设置token有效期
//        //stringRedisTemplate.expire(tokenKey, LOGIN_USER_TTL, TimeUnit.MINUTES);
//
//        // 8.返回token
//        return Result.ok(token);
//    }
//
//
//    private User createUserWithPhone(String phone) {
//        // 1.创建用户
//        User user = new User();
//        user.setPhone(phone);
//        user.setNickName(USER_NICK_NAME_PREFIX + RandomUtil.randomString(10));
//        // 2.保存用户
//        save(user);
//        return user;
//    }
//}